home *** CD-ROM | disk | FTP | other *** search
/ Hyper Stacks 1994 May / Hyper Stacks (Pacific HiTech)(1994)[Mac].iso / HyperTalk / RegionPackage / Picture Window ƒ / WDEFGlobals.c < prev    next >
C/C++ Source or Header  |  1990-12-10  |  1KB  |  63 lines

  1. #include "gestalt.h"
  2. #include "WDEFGlobals.h"
  3.  
  4. #define mySIG '©NP©'
  5.  
  6. OSErr GetWDEFGlobals(create, result) Boolean create; WDEFGlobalsHand result;
  7. {    register Ptr work;
  8.  
  9.     asm
  10.     {    
  11.     @start
  12.         move.l    #mySIG,d0
  13.         dc.w    _Gestalt
  14.         ; OSErr in d0
  15.         bne.s    @notThere
  16.         move.l    result,a1
  17.         move.l    a0,(a1)
  18.         bra.s    @exit
  19.     @notThere
  20.         tst.b    create
  21.         beq.s    @exit
  22.         ; create the globals
  23.         lea        @funcEnd,work
  24.         lea        @funcBeg,a0
  25.         suba.l    a0,work            ; size of gestalt function
  26.         move.l    work,d0
  27.         add.l    #sizeof(WDEFGlobals),d0    ; add in global space
  28.         _NewPtr    CLEAR+SYS
  29.         bne.s    @exit            ; couldn't get memory
  30.         move.l    a0,a1
  31.         lea        @funcBeg,a0
  32.         move.l    work,d0
  33.         move.l    a1,work            ; save destination
  34.         _BlockMove                ; copy function
  35.         move.l    #mySIG,d0
  36.         move.l    work,a0
  37.         dc.w    _NewGestalt        ; allocate
  38.         beq.s    @start            ; ok
  39.         ; failed, return memory
  40.         move.l    work,a0
  41.         move.w    d0,work            ; save reason for fail
  42.         _DisposPtr
  43.         move.w    work,d0            ; restore error
  44.     @exit
  45.     }
  46.     
  47.     return;
  48.     
  49.     /* the gestalt function: pascal OSErr funcBeg(OSType, long *) */
  50.     asm
  51.     {
  52.     @funcBeg:
  53.         movem.l    (a7)+,d0/a0/a1    ; d0 = return address, a0 = long *, a1 = selector
  54.         clr.w    (a7)            ; return noErr        
  55.         lea        @globals,a1
  56.         exg        a1,d0            ; ans -> d0, ret addr -> a1
  57.         move.l    d0,(a0)
  58.         jmp        (a1)
  59.     @funcEnd:
  60.     @globals:
  61.         ; struct WDEFGlobals added here
  62.     }
  63. }